package org.maitaole.interceptor;

import org.maitaole.base.ResponseJson;
import org.maitaole.bean.ValidateCode;
import org.maitaole.commons.Constant;
import org.maitaole.entity.LoginHistory;
import org.maitaole.model.Result;
import org.maitaole.service.ILoginHistoryService;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class ValidateCodeInterceptor implements HandlerInterceptor, ResponseJson {

    private ILoginHistoryService loginHistoryService;

    public void setLoginHistoryService(ILoginHistoryService loginHistoryService) {
        this.loginHistoryService = loginHistoryService;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String captcha = request.getParameter("captcha");  // 获取验证码
        // 表示有验证码
        if(StringUtils.hasText(captcha)) {
            HttpSession session = request.getSession();
            // 获取 Session 中存储的验证码
            ValidateCode validateCode = (ValidateCode)session.getAttribute(Constant.VALIDATE_CODE_ATTR);
            // 如果用户不是通过正常方式来登录，可能拿到为空
            if(null == validateCode) {
                Result result = Result.buildFail("验证码异常");
                outputJson(response, result);
                return false; // 不能往下走了
            }else {  // 用户正常方法
                boolean expired = validateCode.isExpire();
                if(expired) {  // 过期了
                    session.removeAttribute(Constant.VALIDATE_CODE_ATTR);  // 清除验证码
                    Result result = Result.buildFail("验证码过期");
                    outputJson(response, result);
                    return false; // 不能往下走了
                }else {
                    String text = validateCode.getText(); // 获取验证码
                    if(text.equalsIgnoreCase(captcha)) {  // 表示相等，通过
                        return true;
                    }else {  // 验证码错误
                        Result result = Result.buildFail("验证码错误");
                        outputJson(response, result);
                        return false; // 不能往下走了
                    }
                }
            }
        }else {
            Result result = Result.buildFail("验证码不能为空");
            outputJson(response, result);
            return false; // 不能往下走了
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // TODO 用户登录成功之后记录当前登录用户的 ip 地址，以及时间信息
        String ipAddress = request.getRemoteHost();  // 获取用户的ip信息
        LoginHistory lh = new LoginHistory();
        lh.setIp(ipAddress);
        lh.setUsername(request.getParameter("username"));
        loginHistoryService.saveLoginHistory(lh);
    }
}
